from django.http import HttpRequest, HttpResponse, HttpResponseBadRequest
from django.urls import path
import json
import simplejson  # 安装三方json
from .models import User
import random

# django orm crud演示
def reg(request: HttpRequest):
    print(request.GET)  # get 请求参数 字典类型
    print(request.POST)  # post form表单请求参数， 字典类型
    print(request.content_params)  #
    print(request.body)  # json请求体
    try:
        # 内置json解析, 参数必须为字符串
        # json.loads(request.body.decode())
        # 三方json解析器，参数支持二进制，提供json和对象之间的映射
        body = simplejson.loads(request.body)
        print(body.get('email'))  # get方法没有不报错
        print(body['name'], body['password'], body['email'])  # 该方式没有该属性会报错
    except Exception as e:
        print(e)
        print('-' * 66)

    # django中orm数据库映射处理直接使用模型对象即可操作
    # User.objects就是模型管理器，每个模型至少有一个模型管理器，模型.objects
    # 可自定义模型管理器，不过一般不需要，自定义直接 m = Manager()即可
    print(User.objects, type(User.objects))  # User.objects是 Manager类，模型管理器负责和数据库交互
    # 管理器方法User.objects获取是才会有该属性，调用该属性时会判断，没有则新增该属性，该编程方式被称为元编程
    # 1. 管理器有许多数据库操作方法，如filter() exclude() all() get() count() first() last() order_by() 等
    # 2. 查询表达式， 语法：字段__操作符=值，如：id__lt=1 代表 id > 1的记录
    # 3. 复杂查询对象Q, 提供and or not的查询条件，(Q(查询表达式) [&|~] Q(查询表达式)). 支持filter() exclude() get() ,如 filter(Q(id=1) & Q(age>10))
    email = request.GET['email']
    u = User.objects.filter(email=email)  # 查询，django中的查询都为懒加载，只有遇到for if 语句时才会查询
    if u:
        return HttpResponseBadRequest()

    try:
        u = User()
        u.email = email
        u.name = request.GET['name']  # 娶不到报错
        u.password = request.GET.get('password', '123')  # 娶不到不报错, 返回默认值
        u.save()  # 保存
        print('save success', u)
    except Exception as e:
        print('error', e)
    finally:
        print('-' * 66)

    qs = User.objects.all()  # 等于User.objects.filter().all() 返回QuerySet对象查询结果集
    print(type(qs), qs.query)  # query属性存储查询生成的sql字符串
    print(User.objects.count(), qs)
    print('-' * 66)

    # 等于 User.objects.filter(pk=1).get() pk就是代表主键，可以不指定名称直接使用pk
    # 还等于 User.objects.filter(id=1).get() 等于 User.objects.filter(id__exact=1).get() 查询表达式exact表示精确匹配
    u1 = User.objects.get(pk=u.id) # 查不到报错
    print('before update', u1)
    u1.name = 'cat' + str(random.randint(1, 100))
    u1.save()  # 更新
    print('after update', u1)
    print('-' * 66)

    # u1.delete()  # 删除

    print(User.objects.all()[1:6])  # 分页 limit 5 offset 1

    return HttpResponse()


# user包的urls 配置
urlpatterns = [
    path('reg', reg),
]